

package com.hazelcast.internal.partition;

import com.hazelcast.spi.partitiongroup.MemberGroup;

import java.util.Collection;

public interface PartitionStateGenerator {

    /**
     * Arranges the partition layout.
     * <p>
     * This method does not actually change the partitions, but send back the updated layout.
     * <p>
     * A two-dimensional array of addresses is returned where the first index is the partition ID, and
     * the second index is the replica index.
     *
     * @param groups       member groups
     * @param currentState current partition state.
     * @return proposed partition table
     */
    PartitionReplica[][] arrange(Collection<MemberGroup> groups, InternalPartition[] currentState);

    /**
     * Arranges the partition layout.
     * <p>
     * This method does not actually change the partitions, but send back the updated layout.
     * <p>
     * A two-dimensional array of addresses is returned where the first index is the partition ID, and
     * the second index is the replica index.
     * <p>
     * When null partitions is given, all partitions will be arranged,
     * similar to {@link #arrange(Collection, InternalPartition[])}.
     *
     * @param groups       member groups
     * @param currentState current partition state.
     * @param partitions   Partitions to be arranged only.
     * @return proposed partition table
     */
    PartitionReplica[][] arrange(Collection<MemberGroup> groups, InternalPartition[] currentState, Collection<Integer> partitions);
}
